package com.ys.io.p4对象流;

/**
 * 描述:
 * 深拷贝,可以拷贝对象的里的对象,并且是拷贝对象状态的一种拷贝
 *
 * 我们前边学到的数据流只能实现对基本数据类型和字符串类型的读写，并不能读取对象（字符串除外），如果要对某个对象进行读写操作，我们需要学习一对新的处理流：ObjectInputStream和ObjectOutputStream。
 * ObjectOutputStream代表对象输出流，可以对Java中的基本数据和对象进行序列化操作。
 * ObjectInputStream代表对象输入流，可以对 ObjectOutputStream 写入的Java中基本数据和对象进行反序列化。
 *
 * 对象流: 主要是三种功能:对象的克隆(IO来做对象的克隆), 序列化,反序列化,
 * @author CodeYang
 * @version 2021/1/4 10:58
 */
public class p1使用clone来克隆对象 {



    public static void main(String[] args) {
        //method01();
        try {
            method02();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 深拷贝:
     *  不仅拷贝对象本身,而且还拷贝对象包含的引用的对象,
     *  是拷贝对象的"当前"状态,并返回一个新对象,其地址值完全不同,把对象完整的克隆了一份
     */
    private static void method02() throws Exception {
        // 初始化对象
        OutObject outObject = new OutObject("ys",18,new InnerObject("erzi"));

        // 深克隆,拷贝对象当前的状态
        OutObject newObject = (OutObject) outObject.clone();
        newObject.setName("wangba1");
        newObject.setInnerObject(new InnerObject("新"));
        //原对象
        System.out.println("old:"+outObject);
        //新对象
        System.out.println("new:"+newObject);

        System.out.println("地址值old: \t"+outObject.hashCode()+"\t"+"地址值:new \t"+newObject.hashCode());
    }

    /**
     * 潜拷贝:
     * 是拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象
     * 操作新对象和原对象时,都会使 指向"对象"发生改变.
     */
    private static void method01() {
        // 初始化对象
        OutObject outObject = new OutObject("ys",18,new InnerObject("erzi"));

        // 潜拷贝  把对象的地址交给它,也可以操作对象的数据,但是一改全改
        OutObject newObject = outObject;
        //操作新对象,原对象也会发生改变
        newObject.setName("wangba1");
        newObject.setInnerObject(new InnerObject("新"));
        //原对象
        System.out.println("old:"+outObject);
        //新对象
        System.out.println("new:"+newObject);

        System.out.println("地址值old:"+outObject.hashCode()+"地址值:new"+newObject.hashCode());
    }
}
